/** return false/true 在多级嵌套函数中容易丢失异常 
 * 防止异常丢失使用 try...catch 但只对同步有效*/
// function fun() {
//   try {
//     fun2()
//   }catch(err) {
//     throw err
//   }
//   return 'success'
// }
// function fun2() {
//   try {
//     fun3()
//   } catch (err) {
//     throw err
//   }
// }

// function fun3() {
//   try {
//     console.log(1/0)
//     // console.log(a)
//   } catch (err) {
//     throw err
//   }
// }
// fun()



/** 异步 异常处理 catch无法捕捉异步的异常
 * 原因： 调用fun2()后结果已经被return出去了 catch未被执行
*/
// function fun1() {
//   try {
//     fun2()       
//   } catch(err) {
//     console.log(err)
//   }
// }
// function fun2() {
//   setTimeout(() => {
//     throw new Error('error')  // throw new Error('error')
//   }, 500)
// }
// fun1()


/**将异步函数用promise包装，返回promise 
 * 异步执行顺序混乱 使用asnyc...await 把异步变同步，await捕获异常信息
 * await可以对表达式求值（ 不加await, 就是一个没有处理promise的异常）
*/
// async function fun1() {
//   try {
//     await fun2()
//   } catch(err){
//     console.log(err)
//   }
// }

// function fun2() {
//   return new Promise((resolve, reject) => {
//     const r = Math.random()
//     if(r < 0.5) {
//       reject('error')
//     }
//   })
// }

// fun1()

/** 使用中间件 全局监听异常 -> core/middlewares/exception.js */

